package Views;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import org.lwjgl.openal.AL;
import Controllers.*;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.PixmapIO;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.*;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeFontParameter;
import com.badlogic.gdx.utils.ScreenUtils;
public class Visualisation implements ApplicationListener {
enum VisualisationType {
TopDown, SideView
};
public VisPanel[] panels;
private int width, height;
private AssetManager manager;
private SpriteBatch batch;
private SpriteBatch controlsBatch;
private SpriteBatch sideOnViewBatch;
private Runway runway;
private String[] assets =
{
"assets/data/runwayworking.png", "assets/data/sidevis.png", "assets/data/blank.jpg",
"assets/data/sideplane.png", "assets/data/topplane.png", "assets/data/sidecar.png",
"assets/data/topcar.png", "assets/data/Navigation_Controls/ZoomIn.PNG", "assets/data/Navigation_Controls/ZoomOut.PNG",
"assets/data/Navigation_Controls/RightRotate.PNG", "assets/data/Navigation_Controls/LeftRotate.PNG",
"assets/data/Navigation_Controls/ResetView.PNG", "assets/data/Navigation_Controls/PanLeft.PNG",
"assets/data/Navigation_Controls/PanRight.PNG", "assets/data/Navigation_Controls/TiltUp.PNG",
"assets/data/Navigation_Controls/TiltDown.PNG", "assets/data/Navigation_Controls/Compass.PNG",
"assets/data/New_Runway_Graphics/DisplacedThreshold.png","assets/data/New_Runway_Graphics/DisplacedThresholdR.png",
"assets/data/New_Runway_Graphics/grassbottom.png", "assets/data/New_Runway_Graphics/ClearedAndGraded.png",
"assets/data/New_Runway_Graphics/Runway.PNG", "assets/data/New_Runway_Graphics/sidevis.png",
"assets/data/New_Runway_Graphics/ClearwayMarker.PNG", "assets/data/New_Runway_Graphics/ClearwayMarkerR.PNG",
"assets/data/New_Runway_Graphics/Clearway.PNG", "assets/data/New_Runway_Graphics/ClearwayR.PNG",
"assets/data/New_Runway_Graphics/Stopway.PNG", "assets/data/New_Runway_Graphics/StopwayR.PNG",
"assets/data/New_Runway_Graphics/stopwayMarker.jpg", "assets/data/New_Runway_Graphics/stopwayMarkerR.jpg"
};
private FreeTypeFontGenerator generator;
private static int counter = 1;
public Visualisation(Runway runway) {
this.runway = runway;
}
public void setSize(int width, int height) {
this.resize(width, height);
}
@Override
public void resize(int arg0, int arg1) {
width = arg0;
height = arg1;
}
public void update(Runway newRunway) {
this.runway = newRunway;
for (VisPanel panel : panels)
panel.updateVis(runway);
}
// It's LibGDX from here down
@Override
public void create() {
manager = new AssetManager();
for(String asset : assets)
manager.load(asset, Texture.class);
manager.finishLoading();
generator = new FreeTypeFontGenerator(Gdx.files.internal("assets/data/OSB.ttf"));
FreeTypeFontParameter parameter = new FreeTypeFontParameter();
parameter.size = 22;
BitmapFont largeFont = generator.generateFont(parameter);
parameter.size = 16;
BitmapFont smallFont = generator.generateFont(parameter);
panels = new VisPanel[2];
panels[1] = new VisPanel(manager, VisualisationType.SideView, width, height / 2, 0, runway, largeFont, smallFont);
panels[0] = new VisPanel(manager, VisualisationType.TopDown, width, height / 2, height / 2, runway, largeFont, smallFont);
batch = new SpriteBatch();
controlsBatch = new SpriteBatch();
sideOnViewBatch = new SpriteBatch();
}
@Override
public void pause() {}
@Override
public void resume() {}
@Override
public void dispose() {
generator.dispose();
AL.destroy();
Gdx.app.exit();
}
public void checkInput(){
float change = 0.8f;
if(Gdx.input.isKeyPressed(Keys.SHIFT_LEFT) || Gdx.input.isKeyPressed(Keys.SHIFT_RIGHT)){
change = 2.2f;
}
if(Gdx.input.isKeyPressed(Keys.DOWN)){
for (VisPanel panel : panels) {
panel.tiltLevel -= change;
}
}else
if(Gdx.input.isKeyPressed(Keys.UP)){
for (VisPanel panel : panels) {
panel.tiltLevel += change;
}
}else
if(Gdx.input.isKeyPressed(Keys.LEFT)){
for (VisPanel panel : panels) {
panel.panLevel -= change;
}
}else
if(Gdx.input.isKeyPressed(Keys.RIGHT)){
for (VisPanel panel : panels) {
panel.panLevel += change;
}
}else
if(Gdx.input.isKeyPressed(Keys.M)){
for (VisPanel panel : panels) {
panel.zoomLevel += change * 0.005f;
panel.tiltLevel += change * 1.8;
panel.panLevel += change * 1.8;
}
}else
if(Gdx.input.isKeyPressed(Keys.N)){
for (VisPanel panel : panels) {
panel.zoomLevel -= change * 0.005f;
panel.tiltLevel -= change * 1.8;
panel.panLevel -= change * 1.8;
}
}else
if(Gdx.input.isKeyPressed(Keys.P)){
for (VisPanel panel : panels) {
panel.rotation += change*.5f;
panel.tiltLevel += change * 1.5 * (Math.sin(Math.toRadians(panel.rotation)));
}
}else
if(Gdx.input.isKeyPressed(Keys.O)){
for (VisPanel panel : panels) {
panel.rotation -= change*.5f;
panel.tiltLevel -= change * 1.5 * (Math.sin(Math.toRadians(panel.rotation)));
}
}else
if(Gdx.input.isKeyPressed(Keys.R)){
for (VisPanel panel : panels) {
panel.tiltLevel = 0.0f;
panel.panLevel = 0.0f;
panel.zoomLevel = 1.0f;
panel.rotation = 0.0f;
}
} else if (Gdx.input.isKeyPressed(Keys.K)) {
for (VisPanel panel : panels) {
float originalRoataion = panel.rotation;
panel.rotation = (180.0f + (runway.getRunwayID() * 10.0f)) % 360.0f;
panel.tiltLevel -= (originalRoataion - panel.rotation) * Gdx.graphics.getHeight() / 360.0;
}
}
if(Gdx.input.isTouched()){
for (VisPanel panel : panels) {
int mouseX = (int) (Gdx.input.getX() + (450-392) - (Gdx.graphics.getWidth() / 2.0f));
int mouseY = (int) (-Gdx.input.getY() + (232-306) + (Gdx.graphics.getHeight() / 2.0f));
ArrayList<Integer> buttonXPositions = panel.controlStartX;
ArrayList<Integer> buttonYPositions = panel.controlStartY;
int buttonWidth = panel.buttonWidth;
if(buttonXPositions != null && buttonYPositions != null){
int i = 0;
if (isOnButton(mouseX, mouseY, buttonXPositions.get(i), buttonYPositions.get(i), buttonWidth)) {
panel.zoomLevel += change * 0.005f;
panel.tiltLevel += change * 1.8;
panel.panLevel += change * 1.8;
}
i += 1;
if (isOnButton(mouseX, mouseY, buttonXPositions.get(i), buttonYPositions.get(i), buttonWidth)) {
panel.zoomLevel -= change * 0.005f;
panel.tiltLevel -= change * 1.8;
panel.panLevel -= change * 1.8;
}
i += 1;
if (isOnButton(mouseX, mouseY, buttonXPositions.get(i), buttonYPositions.get(i), buttonWidth)) {
panel.rotation += change*.5f;
panel.tiltLevel += change * 1.5 * (Math.sin(Math.toRadians(panel.rotation)));
}
i += 1;
if (isOnButton(mouseX, mouseY, buttonXPositions.get(i), buttonYPositions.get(i), buttonWidth)) {
panel.rotation -= change*.5f;
panel.tiltLevel -= change * 1.5 * (Math.sin(Math.toRadians(panel.rotation)));
}
i += 1;
if (isOnButton(mouseX, mouseY, buttonXPositions.get(i), buttonYPositions.get(i), buttonWidth)) {
panel.tiltLevel += change;
}
i += 1;
if (isOnButton(mouseX, mouseY, buttonXPositions.get(i), buttonYPositions.get(i), buttonWidth)) {
panel.tiltLevel = 0.0f;
panel.panLevel = 0.0f;
panel.zoomLevel = 1.0f;
panel.rotation = 0.0f;
}
i += 1;
if (isOnButton(mouseX, mouseY, buttonXPositions.get(i), buttonYPositions.get(i), buttonWidth)) {
panel.panLevel -= change;
}
i += 1;
if (isOnButton(mouseX, mouseY, buttonXPositions.get(i), buttonYPositions.get(i), buttonWidth)) {
panel.panLevel += change;
}
i += 1;
if (isOnButton(mouseX, mouseY, buttonXPositions.get(i), buttonYPositions.get(i), buttonWidth)) {
panel.tiltLevel -= change;
}
i += 1;
buttonWidth += 7;
if (mouseX > buttonXPositions.get(i) + buttonWidth && mouseX < buttonXPositions.get(i) + 2.0 * buttonWidth && mouseY > buttonYPositions.get(i) && mouseY < buttonYPositions.get(i) + buttonWidth ) {
float originalRoataion = panel.rotation;
panel.rotation = (180.0f + (runway.getRunwayID() * 10.0f)) % 360.0f;
panel.tiltLevel -= (originalRoataion - panel.rotation) * Gdx.graphics.getHeight() / 360.0;
}
}
}
}
}
private boolean isOnButton(int mouseX, int mouseY, int buttonPositionX, int buttonPositionY, int buttonWidth)
{
return mouseX > buttonPositionX + 2.0 * buttonWidth && mouseX < buttonPositionX + 3.0 * buttonWidth
&&
mouseY > buttonPositionY && mouseY < buttonPositionY + buttonWidth;
}
public void saveScreenshot()
{
Gdx.app.postRunnable(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
try {
panels[0].screenshotInProgress = true;
render();
FileHandle fh;
do {
fh = new FileHandle("screenshot" + counter ++ + ".png");
} while (fh.exists());
Pixmap pixmap = getScreenshot(0, 0, Gdx.graphics.getWidth(),
Gdx.graphics.getHeight(), true);
PixmapIO.writePNG(fh, pixmap);
pixmap.dispose();
} catch (Exception e) {
e.printStackTrace();
}
panels[0].screenshotInProgress = false;
}});
panels[0].screenshotInProgress = false;
}
private Pixmap getScreenshot(int x, int y, int w, int h,
boolean yDown) {
final Pixmap pixmap = ScreenUtils.getFrameBufferPixmap(x, y, w, h);
if (yDown) {
// Flip the pixmap upside down
ByteBuffer pixels = pixmap.getPixels();
int numBytes = w * h * 4;
byte[] lines = new byte[numBytes];
int numBytesPerLine = w * 4;
for (int i = 0; i < h; i++) {
pixels.position((h - i - 1) * numBytesPerLine);
pixels.get(lines, i * numBytesPerLine, numBytesPerLine);
}
pixels.clear();
pixels.put(lines);
}
return pixmap;
}
@Override
public void render() {
Gdx.gl.glClearColor(0, 0, 0.2f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
try {
Thread.sleep(25);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
batch.begin();
controlsBatch.begin();
// sideOnViewBatch.begin();
for (VisPanel panel : panels) {
panel.update(Gdx.graphics.getDeltaTime());
panel.render(batch, controlsBatch, sideOnViewBatch);
}
batch.end();
controlsBatch.end();
// sideOnViewBatch.end();
checkInput();
}
public void toggleIsLanding() {
for (VisPanel panel : panels) {
panel.toggleIsLanding();
}
}
public void toggleIsFromLeft() {
for (VisPanel panel : panels) {
panel.toggleApproachFromLeft();
}
}
}